//
// lick.c
// the interleaved data format
//
// (c) 2008 why the lucky stiff, the freelance professor
//
#include <stdio.h>
#include <stdlib.h>
#include "potion.h"
#include "internal.h"

// 构建结构 PNLick 。
PN potion_lick(Potion *P, PN name, PN inner, PN attr) {
  vPN(Lick) lk = PN_ALLOC(PN_TLICK, struct PNLick);
  lk->name = name;
  lk->attr = attr;
  lk->inner = inner;
  return (PN)lk;
}

// 取 PNLick self 的属性，可为 nil 。
PN_MSG(potion_lick_attr) {
  return ((struct PNLick *)self)->attr;
}

// 取 PNLick self.inner （如果是元组），否则为 nil 。
PN_MSG(potion_lick_licks) {
  PN licks = ((struct PNLick *)self)->inner;
  if (PN_IS_TUPLE(licks)) return licks;
  return PN_NIL;
}

// 取 PNLick self 的名字。
PN_MSG(potion_lick_name) {
  return ((struct PNLick *)self)->name;
}

// 取 PNLick self.inner （如果是字符串），否则为 nil 。
PN_MSG(potion_lick_text) {
  PN text = ((struct PNLick *)self)->inner;
  if (PN_IS_STR(text)) return text;
  return PN_NIL;
}

// PNLick self 的字符串化，格式： .name[ .inner][ .attr] 。
PN_MSG(potion_lick_string) {
  PN out = potion_bytes_str(P, "");
  potion_bytes_obj_string(P, out, ((struct PNLick *)self)->name);
  if (((struct PNLick *)self)->inner != PN_NIL) {
    POTION_BYTES_LITERAL(out, " ");
    potion_bytes_obj_string(P, out, ((struct PNLick *)self)->inner);
  }
  if (((struct PNLick *)self)->attr != PN_NIL) {
    POTION_BYTES_LITERAL(out, " ");
    potion_bytes_obj_string(P, out, ((struct PNLick *)self)->attr);
  }
  return PN_STR_B(out);
}

// 注册虚表 lick 的消息。
void potion_lick_init(Potion *P) {
  PN lk_vt = PN_VTABLE(PN_TLICK);
  PN_METHOD(lk_vt, "attr",   potion_lick_attr,   0);
  PN_METHOD(lk_vt, "licks",  potion_lick_licks,  0);
  PN_METHOD(lk_vt, "name",   potion_lick_name,   0);
  PN_METHOD(lk_vt, "string", potion_lick_string, 0);
  PN_METHOD(lk_vt, "text",   potion_lick_text,   0);
}
